JsonConverter.

Реализация собственной логики сериализации (десериализации) для типа.

Возможна реализация собственной логики сериализации (десериализации) для типа T и использование ее на уровне классов сущностей в виде атрибутов над свойством.
(Например для Dictionary)

Необходимо реализовать интерфейс JsonConverter или JsonConverter<T>
И либо использовать атрибут [JsonConverter(typeof(ConverterImplementation))]
либо задать JsonConverter в свойствах serializer.Converters.Add(new ConverterImplementation())
Если свойства CanRead/CanWrite задать false, то будет использоваться реализация по умолчанию

Абстрактные типыСериализатор не может самостоятельно десериализовать абстрактный тип т.к. не знает какую реализацию стоит использовать.
Возможное решение:
  1. Поместить исходную json строку в context объекта сериализатора. (Тем самым мы получим возможность обратиться к нему из JsonConverter)
  2. Создать реализацию JsonConverter, которая будет извлекать json строку из context и выполнять анализ, на основе которого можно было бы разрешить тип абстрактного класса. (используя либо анализ строки, либо анализ JObject, либо десиреализацию части объекта)
  3. Навесить данный атрибут над свойством с абстрактным типом класса.
ДатыПри сериализации даты по умолчанию используется формат timestamp с часовым поясом. Если не учитывать, можно получить смещение в несколько часов.

!Дополнение:
DateTimeOffset
https://habr.com/ru/post/139803/
Изменить свойства.
Циклические ссылки

Сериализация объектов с циклическими ссылками

ReferenceLoopHandling
https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm

JSON PathQuerying JSON with complex JSON Path
https://www.newtonsoft.com/json/help/html/QueryJsonSelectTokenJsonPath.htm

JSONPath - XPath for JSON
https://goessner.net/articles/JsonPath/
Теги: